package Learn194;

import Exe.Student;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.function.Consumer;

public class SetDemo1 {
    //无序 不重复 无索引
    public static void main(String[] args) {
        Set<String> s = new HashSet<>();
//        boolean aaa = s.add("aaa");
//        boolean bbb = s.add("bbb");
//        boolean bbb1 = s.add("bbb");//false
//        s.add("ccc");
//        System.out.println(aaa);
//        System.out.println(bbb);
//        System.out.println(bbb1);
//        System.out.println(s);

        //迭代器
//        Iterator<String> it=s.iterator();
//        while(it.hasNext()){
//            String next = it.next();
//            System.out.println(next);
//        }
        //增强for
//        for (String str : s) {
//            System.out.println(str);
//        }
        //lambda表达式
//        s.forEach(new Consumer<String>() {
//            @Override
//            public void accept(String str) {
//                System.out.println(str);
//            }
//        });

//        s.forEach(str-> System.out.println(str));


        //Hash表
        //数组+链表 （8之前） +红黑树
        //哈希值
        //如果未重写Hash Code方法那么计算出来的哈希值都是不一样的 （根据地址值进行计算）
        //如果重写了HashCode方法 那么属性值一样计算出来的哈希值就是一样的
        //哈希碰撞有可能存在 -21亿-21亿 数量超出总数时发生碰撞
//        Student s1=new Student("张三",12);
//        Student s2=new Student("李四",18);
//        Student s3=new Student("张三",12);
//
//        System.out.println(s1.hashCode());
//        System.out.println(s2.hashCode());
//        System.out.println(s3.hashCode());

        //碰撞
//        System.out.println("abc".hashCode());//96354
//        System.out.println("acD".hashCode());

        //底层原理
        //JDK8之前
        //默认创建一个长度16 默认因子为0.75数组 名字table

        //int index=(数组长度-1)&哈希值；

        //判断位置是否是null  如果是那么存入

        //不是null 调用equals 比较属性值  一样不存 不一样 存入数组形成链表
        //JDK8之前 新元素存入数组 老元素挂在下面
        //之后新元素挂在老元素下面

        //如果数组内元素个数大于长度*默认因子的时候 数组进行扩容成原来数组的两倍
        //当链表的长度大于8并且数组长度大于等于64时，链表转化成红黑树的形式 提高查找效率

        //（如果集合存储的是自定义对象，必须重写hashcode和equals方法）

        //解释
        //存和取的顺序不一样 是因为取出来是是从0开始一个链表一个链表取出来的 所以可能不一样
        //没有索引 是因为底层是数组 链表 红黑树组成的 不好分配索引
        //利用hashcode 和equals去重复

        //利用hashcode去重

//        Student s1 = new Student("zhangsan", 23);
//        Student s2 = new Student("lisi", 24);
//        Student s3 = new Student("wangWu", 25);
//        Student s4 = new Student("zhangsan", 23);
//
//        HashSet<Student> hs = new HashSet<>();
//        System.out.println(hs.add(s1));
//        System.out.println(hs.add(s2));
//        System.out.println(hs.add(s3));
//        System.out.println(hs.add(s4));
//
//        System.out.println(hs);
    }

}
